import re

campus_list = ['北京校区', '上海校区', '深圳校区', '广州校区']
course_list = ['python开发', 'Java开发', 'C++开发', 'python自动化测试', '人工智能']
access_list = ['ord', 'admin']


def strMatch(Rules, String):
    if re.match(Rules, String):
        return re.match(Rules, String).group()
    else:
        return False


def inputCheck(args, rules):
    """
    :param args: 功能名称
    :param rules: 校验规则
    :return: 返回校验通过的信息
    """
    while 1:
        input_str = input("请输入{}：".format(args))
        ret = strMatch(rules, input_str)
        if ret:
            break
        else:
            print("{}输入错误,请重新输入！".format(args))
    return ret


def userInfoSelect(access):
    print("请输入需要修改的信息序号：")
    if access == 'admin':
        print("1.密码\n2.年龄\n3.城市\n4.薪水\n5.工龄\n6.校区\n7.课程\n8.权限")
        op = inputCheck('修改信息序号', r'^[1-8]{1}$')
    else:
        print("1.密码\n2.年龄\n3.城市\n4.薪水\n5.工龄\n6.校区\n7.课程")
        op = inputCheck('修改信息序号', r'^[1-7]{1}$')

    if op == '1':
        return op, inputCheck("密码", r'^[0-9a-zA-Z]{6,8}$')
    elif op == '2':
        return op, inputCheck("年龄", r'^[0-9]{1,3}$')
    elif op == '3':
        return op, inputCheck("城市", r'^[\u4e00-\u9fa5]{2,6}$')
    elif op == '4':
        return op, inputCheck("薪水", r'^[a-zA-Z0-9]{4,6}$')
    elif op == '5':
        return op, inputCheck("工龄", r'^[0-9]{1,3}$')
    elif op == '6':
        print("1.北京校区\n\t2.上海校区\n\t3.深圳校区\n\t4.广州校区")
        campus = inputCheck("校区序号", r'^[1-4]{1}$')
        return op, campus_list[int(campus) - 1]
    elif op == '7':
        print("\t1.python开发\n\t2.Java开发\n\t3.C++开发\n\t4.python自动化测试\n\t5.人工智能")
        course = inputCheck("课程序号", r'^[1-5]{1}$')
        return op, campus_list[int(course) - 1]
    elif op == '8':
        print("\t1.普通权限\n\t2.管理员")
        access_num = inputCheck("权限选择序号", r'^[1-2]{1}$')
        return op, access_list[int(access_num)-1]
    else:
        print("程序出现异常")


class FileReadWrite(object):
    """
    功能：文件读写、文件内容替换相关操作
    """

    def __init__(self, fileName):
        """
        :param fileName: 需要操作的文件名
        """
        self.fileName = fileName

    def write_file(self, AnyStr, flag=True):
        """
        功能：写文件
        :param flag: 给新增用户使用
        :param AnyStr: 需要写入文件的内容
        :return: 无返回
        """
        if flag:
            with open(self.fileName, mode='w', encoding='utf-8') as fp:
                fp.write(AnyStr)
        else:
            with open(self.fileName, mode='a+', encoding='utf-8') as fp:
                fp.write(AnyStr)

    def read_file(self):
        """
        功能：读取文件内容
        :return: 返回读取的内容
        """
        with open(self.fileName, mode='r', encoding='utf-8') as fp:
            return fp.read()

    def ret_fp(self):
        """
        功能：返回文件对象
        :return: 返回文件对象
        """
        return open(self.fileName, mode='r', encoding='utf-8')

    def replaceStr(self, user, oldStr='', newStr='', flag='up'):
        """
        功能：替换文件里面指定内容
        :param flag: 判断删除用户使用
        :param user: 替换的用户
        :param oldStr: 需要替换的用户信息
        :param newStr: 替换后的用户信息
        :return: 无返回
        """
        str_s = self.read_file()  # 读取所有用户信息
        fp = self.ret_fp()  # 拿到文件对象
        for f in fp:  # 按行读取
            info_list = f.strip().split('--')  # strip去掉前后空格、换行、tab键  split 以"--"分割 返回一个列表 ['']
            if len(info_list) == 1:  # 判断拿到的数据是否为[''],是则去掉
                continue  # 跳过本次执行
            if info_list[0] == user:  # 判断用户名
                old_f = f.strip()  # strip去掉前后空格、换行、tab键  一行
                new_f = f.strip().replace(oldStr, newStr)  # 将需要替换的信息更新  一行
                if flag != 'del':
                    new_str = str_s.replace(old_f, new_f)  # 更新老用户数据
                else:
                    new_str = str_s.replace(old_f, '')

                self.write_file(new_str)  # 将更新的所有用户信息写入文件
        fp.close()

    def isExistsUser(self, user):
        """
        :param user: 判断是否存在的用户
        :return: 存在返回 True  不存在返回 False
        """
        fp = self.ret_fp()
        for f in fp:
            info_list = f.strip().split('--')
            if len(info_list) <= 3:
                continue
            elif user == info_list[0]:
                fp.close()
                return True
        else:
            fp.close()
            return False


class TeacherInfoSystem(FileReadWrite):
    def __init__(self, fileName):
        super().__init__(fileName)

    # 注册功能
    def reg(self):
        """
        功能：注册功能
        :return: 无返回值
        """

        while 1:
            username = inputCheck("用户名", r'^[a-zA-Z0-9]{4,6}$')
            if self.isExistsUser(username):
                print("用户名{}已存在！".format(username))
            else:
                break
        pwd = inputCheck("密码", r'^[0-9a-zA-Z]{6,8}$')
        age = inputCheck("年龄", r'^[0-9]{1,3}$')
        city = inputCheck("城市", r'^[\u4e00-\u9fa5]{2,6}$')
        salary = inputCheck("薪水", r'^[a-zA-Z0-9]{4,6}$')
        work_year = inputCheck("工龄", r'^[0-9]{1,3}$')
        print("1.北京校区\n2.上海校区\n3.深圳校区\n4.广州校区\n")
        campus = inputCheck("校区序号", r'^[1-4]{1}$')
        print("1.python开发\n2.Java开发\n3.C++开发\n4.python自动化测试\n5.人工智能")
        course = inputCheck("课程序号", r'^[1-5]{1}$')
        self.write_file(
            username + '--' + pwd + '--' + age + '--' + city + '--' + salary + '--' + work_year + '--' +
            campus_list[int(campus) - 1] + '--' + course_list[int(course) - 1] + "--ord"
            + '\n', flag=False)

    # 登录功能
    def login(self):
        times = 0
        info_list = []
        while times < 3:
            times += 1
            username = inputCheck('用户名', r'^[a-zA-Z0-9]{4,6}$')
            pwd = inputCheck("密码", r'^[0-9a-zA-Z]{6,8}$')
            fp = self.ret_fp()
            for f in fp:
                info_list = f.strip().split('--')
                if len(info_list) == 1:
                    continue
                if username == info_list[0] and pwd == info_list[1]:
                    print('{}登录成功'.format(username))
                    times = 4
                    break
            else:
                print("登录失败，剩余登录次数：", 3 - times)
        return info_list

    # 查看用户信息
    def query(self, access, user):  # 查询用户信息
        print("用户列表如下：")
        fp = self.ret_fp()
        for f in fp:
            info_list = f.strip().split('--')
            if len(info_list) == 1:
                continue
            if access == 'admin' or user == info_list[0]:
                print('姓名:%s、年龄:%s、城市:%s、薪水:%s、工龄:%s、校区:%s、授课班级:%s、权限:%s' % (info_list[0],
                                                                             info_list[2], info_list[3], info_list[4],
                                                                             info_list[5], info_list[6], info_list[7],
                                                                             info_list[8]
                                                                             ))
            else:
                print('姓名:%s、年龄:%s、城市:%s、薪水:***、工龄:%s、校区:%s、授课班级:%s' % (info_list[0], info_list[2], info_list[3],
                                                                        info_list[5], info_list[6], info_list[7],
                                                                        ))

    # 删除用户
    def delete(self, user):
        self.replaceStr(user=user, flag='del')

    # 修改用户信息
    def update(self, user, old_info, new_info):
        self.replaceStr(user=user, oldStr=old_info, newStr=new_info)

    # 输出用户能够操作哪些功能提示信息
    @staticmethod
    def print(access):
        """
        功能：告诉用户能够操作什么功能
        :param access: 用户权限缩写
        :return: 无返回值
        """
        print('欢迎登录用户管理系统，可以操作功能如下：')
        if access.lower() == 'admin':
            print("\t1.查询用户信息\n\t2.修改用户信息\n\t3.删除用户\n\t4.新增用户\n\t5.输入q/Q退出登录")
        else:
            print("\t1.查询用户信息\n\t2.修改自己信息\n\t3.输入q/Q退出登录")

    def newUser(self, user_Info):
        """
        功能：
        :param user_Info:
        :return:
        """
        self.write_file(user_Info + '\n', flag=False)


per = TeacherInfoSystem('dict.txt')
while 1:
    print("************欢迎访问老师信息管理系统************")
    print("********请进行登录、注册、或者退出**********")
    print("\t1.注册\n\t2.登录\n\t3.输入q或者Q退出系统")
    num = inputCheck('操作序号', r'^[1|2|q|Q]{1}$')
    if num.upper() == 'Q':
        print('退出系统成功！')
        break
    elif num == '1':
        per.reg()
    elif num == '2':
        info = per.login()
        while 1:
            print("**************请选择想要操作,退出登录请输入Q/q******************")
            per.print(info[-1])
            if info[-1] == 'admin':
                input_info = inputCheck("操作序号", r'^[1-4Qq]{1}$')
            else:
                input_info = inputCheck("操作序号", r'^[1|2|q|Q]{1}$')

            if input_info == '1':
                per.query(info[-1], info[0])
            elif input_info == '2':
                data = userInfoSelect(info[-1])
                per.update(info[0], '--' + info[data[0]], '--' + data[1])
            elif input_info == '3':
                per.delete(info[0])
            elif input_info == '4':
                print("用户信息格式:用户名--密码--年龄--城市--薪水--工龄--校区--课程--权限")
                print("例如:king--123456--12--北京--123333--12--广州校区--人工智能--ord")
                userInfo = input("请输入用户信息：")
                per.newUser(user_Info=userInfo)
            elif input_info == 'Q':
                print('退出登录成功！')
                break
            else:
                print("系统出错了！")
    else:
        print("系统出错了！")
